From 90a5fa80af4e826b1b89175f499d9e6b05b7c32e Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Thu, 6 Nov 2014 10:21:48 +0100 Subject: [PATCH] Add GDK_GL env var and GdkGLFlags This moves the GDK_ALWAYS_USE_GL env var to GDK_GL=always. It also changes GDK_DEBUG=nogl to GDK_GL=disable, as GDK_DEBUG is really only about debug loggin. It also adds some completely new flags: software-draw-gl: Always use software fallback for drawing gl content to a cairo_t. This disables the fastpaths that exist for drawing directly to a window and instead reads back the pixels into a cairo image surface. software-draw-surface: Always use software fallback for drawing cairo surfaces onto a gl-using window. This disables e.g. texture-from-pixmap on X11. software-draw: Enables both the above. --- gdk/gdk.c | 16 +++++++++++++++- gdk/gdkgl.c | 9 ++++++--- gdk/gdkglobals.c | 1 + gdk/gdkinternals.h | 12 ++++++++++-- gdk/gdkwindow.c | 9 ++------- 5 files changed, 34 insertions(+), 13 deletions(-) diff --git a/gdk/gdk.c b/gdk/gdk.c index e40cdea1a3..2b44b0faaf 100644 --- a/gdk/gdk.c +++ b/gdk/gdk.c @@ -134,6 +134,14 @@ static GMutex gdk_threads_mutex; static GCallback gdk_threads_lock = NULL; static GCallback gdk_threads_unlock = NULL; +static const GDebugKey gdk_gl_keys[] = { + {"disable", GDK_GL_FLAGS_DISABLE}, + {"always", GDK_GL_FLAGS_ALWAYS}, + {"software-draw", GDK_GL_FLAGS_SOFTWARE_DRAW_GL | GDK_GL_FLAGS_SOFTWARE_DRAW_SURFACE}, + {"software-draw-gl", GDK_GL_FLAGS_SOFTWARE_DRAW_GL}, + {"software-draw-surface", GDK_GL_FLAGS_SOFTWARE_DRAW_SURFACE}, +}; + #ifdef G_ENABLE_DEBUG static const GDebugKey gdk_debug_keys[] = { {"events", GDK_DEBUG_EVENTS}, @@ -149,7 +157,6 @@ static const GDebugKey gdk_debug_keys[] = { {"eventloop", GDK_DEBUG_EVENTLOOP}, {"frames", GDK_DEBUG_FRAMES}, {"settings", GDK_DEBUG_SETTINGS}, - {"nogl", GDK_DEBUG_NOGL}, {"opengl", GDK_DEBUG_OPENGL}, }; @@ -248,6 +255,7 @@ void gdk_pre_parse_libgtk_only (void) { const char *rendering_mode; + const gchar *gl_string; gdk_initialized = TRUE; @@ -268,6 +276,12 @@ gdk_pre_parse_libgtk_only (void) } #endif /* G_ENABLE_DEBUG */ + gl_string = getenv("GDK_GL"); + if (gl_string != NULL) + _gdk_gl_flags = g_parse_debug_string (gl_string, + (GDebugKey *) gdk_gl_keys, + G_N_ELEMENTS (gdk_gl_keys)); + if (getenv ("GDK_NATIVE_WINDOWS")) { g_warning ("The GDK_NATIVE_WINDOWS environment variable is not supported in GTK3.\n" diff --git a/gdk/gdkgl.c b/gdk/gdkgl.c index 3a6d2814ed..44d205edf0 100644 --- a/gdk/gdkgl.c +++ b/gdk/gdkgl.c @@ -335,7 +335,8 @@ gdk_cairo_draw_from_gl (cairo_t *cr, /* For direct paint of non-alpha renderbuffer, we can just do a bitblit */ - if (source_type == GL_RENDERBUFFER && + if ((_gdk_gl_flags & GDK_GL_FLAGS_SOFTWARE_DRAW_GL) == 0 && + source_type == GL_RENDERBUFFER && alpha_size == 0 && direct_window != NULL && direct_window->current_paint.use_gl && @@ -415,7 +416,8 @@ gdk_cairo_draw_from_gl (cairo_t *cr, } /* For direct paint of alpha or non-alpha textures we can use texturing */ - else if (source_type == GL_TEXTURE && + else if ((_gdk_gl_flags & GDK_GL_FLAGS_SOFTWARE_DRAW_GL) == 0 && + source_type == GL_TEXTURE && direct_window != NULL && direct_window->current_paint.use_gl && trivial_transform && @@ -602,7 +604,8 @@ gdk_gl_texture_from_surface (cairo_surface_t *surface, guint target; paint_context = gdk_gl_context_get_current (); - if (paint_context && + if ((_gdk_gl_flags & GDK_GL_FLAGS_SOFTWARE_DRAW_SURFACE) == 0 && + paint_context && GDK_GL_CONTEXT_GET_CLASS (paint_context)->texture_from_surface && GDK_GL_CONTEXT_GET_CLASS (paint_context)->texture_from_surface (paint_context, surface, region)) return; diff --git a/gdk/gdkglobals.c b/gdk/gdkglobals.c index 3e7c762ca4..0bef8d7cb6 100644 --- a/gdk/gdkglobals.c +++ b/gdk/gdkglobals.c @@ -34,4 +34,5 @@ GList *_gdk_default_filters = NULL; gchar *_gdk_display_name = NULL; gchar *_gdk_display_arg_name = NULL; gboolean _gdk_disable_multidevice = FALSE; +guint _gdk_gl_flags = 0; GdkRenderingMode _gdk_rendering_mode = GDK_RENDERING_MODE_SIMILAR; diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h index 0132cd831f..3a6659bac8 100644 --- a/gdk/gdkinternals.h +++ b/gdk/gdkinternals.h @@ -85,10 +85,17 @@ typedef enum { GDK_DEBUG_EVENTLOOP = 1 << 10, GDK_DEBUG_FRAMES = 1 << 11, GDK_DEBUG_SETTINGS = 1 << 12, - GDK_DEBUG_NOGL = 1 << 13, - GDK_DEBUG_OPENGL = 1 << 14 + GDK_DEBUG_OPENGL = 1 << 13, } GdkDebugFlag; +typedef enum { + GDK_GL_FLAGS_DISABLE = 1 << 0, + GDK_GL_FLAGS_ALWAYS = 1 << 1, + GDK_GL_FLAGS_SOFTWARE_DRAW_GL = 1 << 2, + GDK_GL_FLAGS_SOFTWARE_DRAW_SURFACE = 1 << 3, +} GdkGLFlags; + + typedef enum { GDK_RENDERING_MODE_SIMILAR = 0, GDK_RENDERING_MODE_IMAGE, @@ -99,6 +106,7 @@ extern GList *_gdk_default_filters; extern GdkWindow *_gdk_parent_root; extern guint _gdk_debug_flags; +extern guint _gdk_gl_flags; extern GdkRenderingMode _gdk_rendering_mode; #ifdef G_ENABLE_DEBUG diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index c74ca4e2bd..bc9856975b 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -287,16 +287,11 @@ create_surface_accumulator (GSignalInvocationHint *ihint, static GQuark quark_pointer_window = 0; -static gboolean always_use_gl = FALSE; - static void gdk_window_class_init (GdkWindowClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); - if (g_getenv ("GDK_ALWAYS_USE_GL")) - always_use_gl = TRUE; - parent_class = g_type_class_peek_parent (klass); object_class->finalize = gdk_window_finalize; @@ -1424,7 +1419,7 @@ gdk_window_new (GdkWindow *parent, G_CALLBACK (device_removed_cb), window); - if (always_use_gl) + if ((_gdk_gl_flags & (GDK_GL_FLAGS_ALWAYS | GDK_GL_FLAGS_DISABLE)) == GDK_GL_FLAGS_ALWAYS) { GError *error = NULL; @@ -2730,7 +2725,7 @@ gdk_window_ref_impl_surface (GdkWindow *window) GdkGLContext * gdk_window_get_paint_gl_context (GdkWindow *window, GError **error) { - if (_gdk_debug_flags & GDK_DEBUG_NOGL) + if (_gdk_gl_flags & GDK_GL_FLAGS_DISABLE) { g_set_error_literal (error, GDK_GL_ERROR, GDK_GL_ERROR_NOT_AVAILABLE, -- 2.30.2